/*
 * edge.h
 *
 *  Created on: Nov 28, 2010
 *      Author: cumeo89
 */

#ifndef EDGE_H_
#define EDGE_H_

#include <glib.h>
#include "util.h"
#include "node.h"

/**
 * Một cạnh trong cây hậu tố
 */
typedef struct SEdge {

	/**
	 * Chỉ số của xâu chứa nhãn của cạnh trong mảng các xâu cần dựng
	 * cây hậu tố tổng quát.
	 */
	gint stringIndex;

	/**
	 * Chỉ số bắt đầu của nhãn trong xâu lớn.
	 */
	glong start;

	/**
	 * Chỉ số kết thúc của nhãn trong xâu lớn.
	 */
	glong end;

	/**
	 * Đầu mút trên (cha) của cạnh (gần gốc hơn).
	 */
	struct SNode *parent;

	/**
	 * Đầu mút dưới (con) của cạnh (xa gốc hơn).
	 */
	struct SNode *child;
} Edge;

/**
 * Tìm kí tự tại vị trí i trong cạnh.
 * @return kí tự được mã hoá UCS-4
 */
gunichar e_charAt(Edge *edge, glong i, Ucs4String **stringArr);

/**
 * Tìm độ dài cạnh thực sự trong pha thứ i của thuật toán. Lưu ý rằng
 * trường <code>end</code> có thể chứa giá trị -1 để biểu thị điểm cuối
 * của xâu đang xử lí nên trừ end cho start không đảm bảo cho giá trị
 * đúng.
 * @return độ dài cạnh.
 */
glong e_length(Edge *edge, glong i);

/**
 * Khởi tạo một cạnh mới, nút con của cạnh được tự động tạo mới.
 * @return con trỏ đến cạnh mới
 * @see e_new_with_child()
 * @see e_free()
 */
Edge *e_new(int index, glong start, glong end);

/**
 * Khởi tạo cạnh mới với một nút có sẵn
 * @see e_new()
 */
Edge *e_new_with_child(int index, struct SNode *child, glong start, glong end);

/**
 * Chia cạnh thành hai cạnh con tại điểm g. Trả về cạnh ở trên (gần gốc hơn).
 * @return cạnh trên trong hai cạnh con
 */
Edge *e_split(Edge *edge, glong g);

void e_set_child(Edge *edge, struct SNode *child);

/**
 * Giải phóng bộ nhớ chiếm dụng bởi cạnh.
 */
void e_free(Edge *edge);

#endif /* EDGE_H_ */
